package com.movie.controller;

import com.movie.entity.Showtime;
import com.movie.service.ShowtimeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List; // 虽然这个 Controller 可能暂时不用 List，但保留以备将来扩展
import java.util.Map;

@RestController
@RequestMapping("/api/admin/showtimes") // 管理员场次管理的基础路径
@CrossOrigin(origins = "http://localhost:5173", allowCredentials = "true")
@PreAuthorize("hasRole('ADMIN')") // 整个 Controller 都需要管理员权限
public class AdminShowtimeController {

    @Autowired
    private ShowtimeService showtimeService;

    /**
     * 管理员添加新的场次
     * @param showtime 从请求体接收的场次信息
     * @return 创建成功后的场次信息 (包含 ID)
     */
    @PostMapping
    public ResponseEntity<?> createShowtime(@RequestBody Showtime showtime) {
        try {
            Showtime createdShowtime = showtimeService.createShowtime(showtime);
            return ResponseEntity.status(HttpStatus.CREATED).body(createdShowtime);
        } catch (IllegalArgumentException e) {
            // 参数验证失败，返回400错误
            System.err.println("Validation error creating showtime: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                    .body(Map.of("message", e.getMessage()));
        } catch (Exception e) {
            // 其他错误，返回500
            System.err.println("Error creating showtime: " + e.getMessage());
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(Map.of("message", "添加场次失败：" + e.getMessage()));
        }
    }

    /**
     * 管理员获取分页场次列表
     * @param page 页码（从0开始）
     * @param size 每页条数
     * @return 包含场次列表和分页信息的响应
     */
    @GetMapping("/paged")
    public ResponseEntity<Map<String, Object>> getShowtimesPaged(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size) {
        try {
            Map<String, Object> result = showtimeService.getAllShowtimesPaged(page, size);
            return ResponseEntity.ok(result);
        } catch (Exception e) {
            System.err.println("Error fetching paged showtimes: " + e.getMessage());
            e.printStackTrace(); // 在开发环境打印堆栈跟踪
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }

    /**
     * 管理员删除场次
     * @param id 要删除的场次 ID
     * @return 成功则返回 204 No Content，失败则返回相应错误状态
     */
    @DeleteMapping("/{id}")
    public ResponseEntity<?> deleteShowtime(@PathVariable Long id) {
        try {
            boolean deleted = showtimeService.deleteShowtime(id);
            if (deleted) {
                return ResponseEntity.noContent().build(); // 删除成功
            } else {
                // Service 层返回 false 通常意味着未找到资源
                return ResponseEntity.notFound().build();
            }
        } catch (Exception e) {
            // 处理其他可能的异常，例如数据库约束冲突
            System.err.println("Error deleting showtime with id " + id + ": " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }

    /**
     * 管理员更新场次信息
     * @param id 场次ID
     * @param showtime 更新后的场次信息
     * @return 更新后的场次信息
     */
    @PutMapping("/{id}")
    public ResponseEntity<?> updateShowtime(@PathVariable Long id, @RequestBody Showtime showtime) {
        try {
            // 确保ID一致
            showtime.setId(id);

            // 调用Service层更新场次
            Showtime updatedShowtime = showtimeService.updateShowtime(showtime);

            if (updatedShowtime != null) {
                return ResponseEntity.ok(updatedShowtime);
            } else {
                return ResponseEntity.notFound().build();
            }
        } catch (IllegalArgumentException e) {
            // 参数验证失败，返回400错误
            System.err.println("Validation error updating showtime: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                    .body(Map.of("message", e.getMessage()));
        } catch (Exception e) {
            System.err.println("Error updating showtime: " + e.getMessage());
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(Map.of("message", "更新场次失败：" + e.getMessage()));
        }
    }

}